package es.us.lsi.daw.dao.impl;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.NonUniqueObjectException;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import es.us.lsi.daw.model.security.User;
import es.us.lsi.daw.dao.DAOUsuario;

public class DAOUsuarioImpl extends DAOComunImpl implements DAOUsuario {
	
//	public Usuario obtenerUserNameCompleto(String username) {
//		Criteria crtUsuario = this.sessionFactory.getCurrentSession().createCriteria(Usuario.class);
//		crtUsuario.add(Restrictions.eq(Usuario.A_USERNAME, username));
//
//		Usuario usuario = (Usuario) crtUsuario.uniqueResult();
//		if (usuario != null) {
//			
//			Hibernate.initialize(usuario.getPais());
//			Hibernate.initialize(usuario.getLstPagos());
//			
//			List<Marca> lstMarca = usuario.getLstMarca();
//			for(Marca marca: lstMarca){
//				Busqueda busqueda = marca.getBusqueda();
//				
//				Hibernate.initialize(busqueda.getLstMedio());
//				Hibernate.initialize(marca.getCnae());
//				Hibernate.initialize(marca.getConfUmbrales());
//				Hibernate.initialize(marca.getLstProductos());
//				Hibernate.initialize(marca.getLstTerminos());
//			}
//			
//			List<Empresa> lstEmpresa = usuario.getLstEmpresa();
//			for(Empresa empresa: lstEmpresa){
//				Hibernate.initialize(empresa.getPais());
//				Hibernate.initialize(empresa.getCnae());
//			}
//		}
//
//		return usuario;
//	}
	public User obtenerUserNameCompleto(String username){
		return null;
	}

	public boolean existePorUserName(String username) {
		Criteria crtUsuario = this.sessionFactory.getCurrentSession().createCriteria(User.class);
		crtUsuario.add(Restrictions.eq(User.A_USERNAME, username));
		crtUsuario.setProjection(Projections.count(User.A_ID));

		long numUsuario =  (Long) crtUsuario.uniqueResult();
		
		return numUsuario > 0;
	}

	public User obtenerUserNameSimple(String username) {
		Criteria crtUser = this.sessionFactory.getCurrentSession().createCriteria(User.class);
		crtUser.add(Restrictions.eq(User.A_USERNAME, username));
		
		User usuario = (User) crtUser.uniqueResult();
		
		return usuario;
	}

	public <T> boolean guardarUsuario(User usuario) {
		try {
			sessionFactory.getCurrentSession().saveOrUpdate(usuario);
			return true;
		} catch (NonUniqueObjectException e) {
			log.info("NonUniqueObjectException", e);
			try {
				sessionFactory.getCurrentSession().clear();
				sessionFactory.getCurrentSession().saveOrUpdate(usuario);
				return true;
			} catch (HibernateException e1) {
				log.error("Error at guardarUsuario", e);
				return false;
			}
		}
	}

	public void eliminarUsuario(Long idUsuario) {
		Criteria crtUser = this.sessionFactory.getCurrentSession().createCriteria(User.class);
		crtUser.add(Restrictions.idEq(idUsuario));
		User user = (User) crtUser.uniqueResult();
		user.setEnabled(true);
		sessionFactory.getCurrentSession().saveOrUpdate(user);
	}
}
